/**
 *    Copyright 2009-2023 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.apache.ibatis.plugin;

import java.util.Properties;

/**
 * @author Clinton Begin
 */
public interface Interceptor {

  /**
   * 这个方法是插件的核心，它负责在目标方法执行前后进行拦截。在方法内部，你可以根据需要执行一些额外的操作，例如记录日志、
   * 修改参数、抛出异常等。这个方法应该返回一个对象，作为对目标方法的调用结果。如果需要改变目标方法的返回值，你可以直接返回新的对象。
   *
   * @param invocation
   * @return
   * @throws Throwable
   */
  Object intercept(Invocation invocation) throws Throwable;

  /**
   * 这个方法是用于创建目标对象的拦截器。当你使用 MyBatis 时，
   * 你可以在映射文件中或者通过编程方式注册插件。每个插件需要与目标对象关联起来才能工作。
   * 这个方法就是用于创建这种关联的。它接受一个目标对象作为参数，
   * 并返回一个被拦截器包装过的对象。这样，当目标对象被调用时，就会自动触发拦截器的方法。
   * @param target
   * @return
   */
  default Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }

  /**
   * 这个方法用于设置插件的属性。你可以通过这个方法来配置你的插件，例如设置日志级别、事务超时时间等。
   * 这个方法的具体实现可以根据具体的插件需求来决定。在这个默认实现中，它不做任何操作。
   * @param properties
   */
  default void setProperties(Properties properties) {
    // NOP
  }

}
